//
//  RequestAPI.swift
//  Swift-Codedase
//
//  Created by 徐先生 on 2023/2/27.
//

import Foundation
import Moya
import SwiftyUserDefaults

// RequestAPI就是一个遵循TargetType协议的枚举
enum RequestAPI {
    // 正式
    case getSMS(mobile: String)
    // 占位
    case placeholderApi
}

extension RequestAPI: TargetType {
    // 请求地址
    var baseURL: URL {
        switch self {
        default: break
        }
        return URL(string: SystemEnvManager.shared.phpUrl)!
    }
    
    // 请求API
    var path: String {
        switch self {
        case .getSMS: return "/api/user/login"
            
        default:
            fatalError("Request path is null")
        }
    }
    // 请求方式: post/get
    var method: Moya.Method {
        switch self {
        case .placeholderApi:
            return .get
        default: // 默认post请求
            return .post
        }
    }
    
    // 请求任务
    var task: Moya.Task {
        // 公共参数
        var params: [String: Any] = [:]
        // params["token"] = "a1c965c2-2308-4de6-bb10-354ae8845a6e"
        // params["client"] = "app"
        
        // 根据不同的接口传入不同的参数
        switch self {
        case .getSMS(let mobile):
            // 合并字典, 相同key保留最新的value
            params["mobile"] = mobile
            
        default:
            break
        }
        
        // 设置请求类型, 比如没有参数的请求、有参数的请求、上传文件、下载文件
        switch self {
        case .placeholderApi:
            // 没有请求参数的请求。
            return .requestPlain
            
        default:
            // 默认有请求参数
            if method == .get {
                // 在发起GET请求时，确保使用 URLEncoding.default 编码方式，这样参数会被正确添加到URL的查询字符串中，而不是作为请求体发送。
                return .requestParameters(parameters: params, encoding: URLEncoding.default)
            }
            return .requestParameters(parameters: params, encoding: JSONEncoding.default)
        }
    }
    
    // 公共头部信息
    var headers: [String: String]? {
        var headers: [String: String] = [:]
        headers["token"] = Defaults[\.token]
        headers["client"] = "app"
        headers["Content-type"] = "application/json;charset=utf-8"
        headers["requestStartTime"] = String(CFAbsoluteTimeGetCurrent())
        
        switch self {
        default:
            headers["Content-type"] = "application/json;charset=utf-8"
        }
        
        return headers
    }
    
    // 通过statuscode过滤返回内容
    public var validationType: ValidationType {
        switch self {
        case .placeholderApi:
            return .successCodes
        default:
            return .none
        }
    }
    
    // 多用于单元测试,这个属性是返回Stub数据的。
    public var sampleData: Data {
        switch self {
        case .getSMS(let mobile):
            return "{\"login\": \"\(mobile)\", \"id\": 100}".data(using: .utf8)!
        default:
            return "".data(using: .utf8)!
        }
    }
}
